/** 
*
****************************************************************************
* Copyright (C) 2011 - 2015 Bosch Sensortec GmbH
*
* File : bmm050.h
*
* Date : 2015/05/21
*
* Revision : 2.0.4 $
*
* Usage: Sensor Driver for BMM050 and BMM150 sensor
*
****************************************************************************
*
* \section License
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
*   Redistributions of source code must retain the above copyright
*   notice, this list of conditions and the following disclaimer.
*
*   Redistributions in binary form must reproduce the above copyright
*   notice, this list of conditions and the following disclaimer in the
*   documentation and/or other materials provided with the distribution.
*
*   Neither the name of the copyright holder nor the names of the
*   contributors may be used to endorse or promote products derived from
*   this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER
* OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
*
* The information provided is believed to be accurate and reliable.
* The copyright holder assumes no responsibility
* for the consequences of use
* of such information nor for any infringement of patents or
* other rights of third parties which may result from its use.
* No license is granted by implication or otherwise under any patent or
* patent rights of the copyright holder.
**************************************************************************/
/****************************************************************************/
/*! \file bmm050.h
    \brief BMM050 Sensor Driver Support Header File */

#ifndef __BMM050_H__
#define __BMM050_H__

/*!
* @brief For Enabling and Disabling the floating point API's
* If your platform supports the FLOAT support, please enable this
* macro
*/
/*#define ENABLE_FLOAT*/

/*!
* @brief The following definition uses for define the data types
*
* @note While porting the API please consider the following
* @note Please check the version of C standard
* @note Are you using Linux platform
*/

/*!
* @brief For the Linux platform support
* Please use the types.h for your data types definitions
*/
#ifdef	__KERNEL__

#include <linux/types.h>
/* singed integer type*/
typedef	int8_t s8;/**< used for signed 8bit */
typedef	int16_t s16;/**< used for signed 16bit */
typedef	int32_t s32;/**< used for signed 32bit */
typedef	int64_t s64;/**< used for signed 64bit */

typedef	u_int8_t u8;/**< used for unsigned 8bit */
typedef	u_int16_t u16;/**< used for unsigned 16bit */
typedef	u_int32_t u32;/**< used for unsigned 32bit */
typedef	u_int64_t u64;/**< used for unsigned 64bit */



#else /* ! __KERNEL__ */
/**********************************************************
* These definition uses for define the C
* standard version data types
***********************************************************/
# if defined(__STDC_VERSION__)

/************************************************
 * compiler is C11 C standard
************************************************/
#if (__STDC_VERSION__ == 201112L)

/************************************************/
#include <stdint.h>
/************************************************/

/*unsigned integer types*/
typedef	uint8_t u8;/**< used for unsigned 8bit */
typedef	uint16_t u16;/**< used for unsigned 16bit */
typedef	uint32_t u32;/**< used for unsigned 32bit */
typedef	uint64_t u64;/**< used for unsigned 64bit */

/*signed integer types*/
typedef	int8_t s8;/**< used for signed 8bit */
typedef	int16_t s16;/**< used for signed 16bit */
typedef	int32_t s32;/**< used for signed 32bit */
typedef	int64_t s64;/**< used for signed 64bit */
/************************************************
 * compiler is C99 C standard
************************************************/

#elif (__STDC_VERSION__ == 199901L)

/* stdint.h is a C99 supported c library.
which is used to fixed the integer size*/
/************************************************/
#include <stdint.h>
/************************************************/

/*unsigned integer types*/
typedef	uint8_t u8;/**< used for unsigned 8bit */
typedef	uint16_t u16;/**< used for unsigned 16bit */
typedef	uint32_t u32;/**< used for unsigned 32bit */
typedef	uint64_t u64;/**< used for unsigned 64bit */

/*signed integer types*/
typedef int8_t s8;/**< used for signed 8bit */
typedef	int16_t s16;/**< used for signed 16bit */
typedef	int32_t s32;/**< used for signed 32bit */
typedef	int64_t s64;/**< used for signed 64bit */
/************************************************
 * compiler is C89 or other C standard
************************************************/

#else /*  !defined(__STDC_VERSION__) */
/*!
* @brief By default it is defined as 32 bit machine configuration
*	define your data types based on your
*	machine/compiler/controller configuration
*/
#define  MACHINE_32_BIT

/*! @brief
 *	If your machine support 16 bit
 *	define the MACHINE_16_BIT
 */
#ifdef MACHINE_16_BIT
#include <limits.h>
/*signed integer types*/
typedef	signed char  s8;/**< used for signed 8bit */
typedef	signed short int s16;/**< used for signed 16bit */
typedef	signed long int s32;/**< used for signed 32bit */

#if defined(LONG_MAX) && (LONG_MAX == 0x7fffffffffffffffL)
typedef long int s64;/**< used for signed 64bit */
typedef unsigned long int u64;/**< used for unsigned 64bit */
#elif defined(LLONG_MAX) && (LLONG_MAX == 0x7fffffffffffffffLL)
typedef long long int s64;/**< used for signed 64bit */
typedef unsigned long long int u64;/**< used for unsigned 64bit */
#else
#warning Either the correct data type for signed 64 bit integer \
could not be found, or 64 bit integers are not supported in your environment.
#warning If 64 bit integers are supported on your platform, \
please set s64 manually.
#endif

/*unsigned integer types*/
typedef	unsigned char u8;/**< used for unsigned 8bit */
typedef	unsigned short int u16;/**< used for unsigned 16bit */
typedef	unsigned long int u32;/**< used for unsigned 32bit */

/* If your machine support 32 bit
define the MACHINE_32_BIT*/
#elif defined MACHINE_32_BIT
/*signed integer types*/
typedef	signed char  s8;/**< used for signed 8bit */
typedef	signed short int s16;/**< used for signed 16bit */
typedef	signed int s32;/**< used for signed 32bit */
typedef	signed long long int s64;/**< used for signed 64bit */

/*unsigned integer types*/
typedef	unsigned char u8;/**< used for unsigned 8bit */
typedef	unsigned short int u16;/**< used for unsigned 16bit */
typedef	unsigned int u32;/**< used for unsigned 32bit */
typedef	unsigned long long int u64;/**< used for unsigned 64bit */

/* If your machine support 64 bit
define the MACHINE_64_BIT*/
#elif defined MACHINE_64_BIT
/*signed integer types*/
typedef	signed char  s8;/**< used for signed 8bit */
typedef	signed short int s16;/**< used for signed 16bit */
typedef	signed int s32;/**< used for signed 32bit */
typedef	signed long int s64;/**< used for signed 64bit */

/*unsigned integer types*/
typedef	unsigned char u8;/**< used for unsigned 8bit */
typedef	unsigned short int u16;/**< used for unsigned 16bit */
typedef	unsigned int u32;/**< used for unsigned 32bit */
typedef	unsigned long int u64;/**< used for unsigned 64bit */

#else
#warning The data types defined above which not supported \
define the data types manually
#endif
#endif

/*** This else will execute for the compilers
 *	which are not supported the C standards
 *	Like C89/C99/C11***/
#else
/*!
* @brief By default it is defined as 32 bit machine configuration
*	define your data types based on your
*	machine/compiler/controller configuration
*/
#define  MACHINE_32_BIT

/* If your machine support 16 bit
define the MACHINE_16_BIT*/
#ifdef MACHINE_16_BIT
#include <limits.h>
/*signed integer types*/
typedef	signed char  s8;/**< used for signed 8bit */
typedef	signed short int s16;/**< used for signed 16bit */
typedef	signed long int s32;/**< used for signed 32bit */

#if defined(LONG_MAX) && LONG_MAX == 0x7fffffffffffffffL
typedef long int s64;/**< used for signed 64bit */
typedef unsigned long int u64;/**< used for unsigned 64bit */
#elif defined(LLONG_MAX) && (LLONG_MAX == 0x7fffffffffffffffLL)
typedef long long int s64;/**< used for signed 64bit */
typedef unsigned long long int u64;/**< used for unsigned 64bit */
#else
#warning Either the correct data type for signed 64 bit integer \
could not be found, or 64 bit integers are not supported in your environment.
#warning If 64 bit integers are supported on your platform, \
please set s64 manually.
#endif

/*unsigned integer types*/
typedef	unsigned char u8;/**< used for unsigned 8bit */
typedef	unsigned short int u16;/**< used for unsigned 16bit */
typedef	unsigned long int u32;/**< used for unsigned 32bit */

/*! @brief If your machine support 32 bit
define the MACHINE_32_BIT*/
#elif defined MACHINE_32_BIT
/*signed integer types*/
typedef	signed char  s8;/**< used for signed 8bit */
typedef	signed short int s16;/**< used for signed 16bit */
typedef	signed int s32;/**< used for signed 32bit */
typedef	signed long long int s64;/**< used for signed 64bit */

/*unsigned integer types*/
typedef	unsigned char u8;/**< used for unsigned 8bit */
typedef	unsigned short int u16;/**< used for unsigned 16bit */
typedef	unsigned int u32;/**< used for unsigned 32bit */
typedef	unsigned long long int u64;/**< used for unsigned 64bit */

/* If your machine support 64 bit
define the MACHINE_64_BIT*/
#elif defined MACHINE_64_BIT
/*signed integer types*/
typedef	signed char  s8;/**< used for signed 8bit */
typedef	signed short int s16;/**< used for signed 16bit */
typedef	signed int s32;/**< used for signed 32bit */
typedef	signed long int s64;/**< used for signed 64bit */

/*unsigned integer types*/
typedef	unsigned char u8;/**< used for unsigned 8bit */
typedef	unsigned short int u16;/**< used for unsigned 16bit */
typedef	unsigned int u32;/**< used for unsigned 32bit */
typedef	unsigned long int u64;/**< used for unsigned 64bit */

#else
#warning The data types defined above which not supported \
define the data types manually
#endif
#endif
#endif

/********************************************/
/**\name	ENABLE FLATING OUTPUT      */
/**************************************/
/*!
* @brief If the user wants to support floating point calculations, please set
	the following define. If floating point
	calculation is not wanted or allowed
	(e.g. in Linux kernel), please do not set the define. */
#define ENABLE_FLOAT
/***************************************************************/
/**\name	BUS READ AND WRITE FUNCTION POINTERS        */
/***************************************************************/
/*!
	@brief Define the calling convention of YOUR bus communication routine.
	@note This includes types of parameters. This example shows the
	configuration for an SPI bus link.

    If your communication function looks like this:

    write_my_bus_xy(u8 device_addr, u8 register_addr,
    u8 * data, u8 length);

    The BMM050_WR_FUNC_PTR would equal:

    BMM050_WR_FUNC_PTR s8 (* bus_write)(u8,
    u8, u8 *, u8)

    Parameters can be mixed as needed refer to the
    refer BMM050_BUS_WRITE_FUNC  macro.


*/
#define BMM050_BUS_WR_RETURN_TYPE s8
#define BMM050_BUS_WR_PARAM_TYPES \
u8, u8, u8 *, u8
#define BMM050_BUS_WR_PARAM_ORDER \
(device_addr, register_addr, register_data, wr_len)
#define BMM050_BUS_WRITE_FUNC( \
device_addr, register_addr, register_data, wr_len) \
bus_write(device_addr, register_addr, register_data, wr_len)

/*!
	@brief  link macro between API function calls and bus read function
	@note The bus write function can change since this is a
	system dependant issue.

    @note If the bus_read parameter calling order is like: reg_addr,
    reg_data, wr_len it would be as it is here.

    @note If the parameters are differently ordered or your communication
    function like I2C need to know the device address,
    you can change this macro accordingly.


    @note BMM050_BUS_READ_FUNC(dev_addr, reg_addr, reg_data, wr_len)\
    bus_read(dev_addr, reg_addr, reg_data, wr_len)

    @note This macro lets all API functions call
	YOUR communication routine in a
    way that equals your definition in the
    refer BMM050_RD_FUNC_PTR definition.

    @note : this macro also includes the "MSB='1'
    for reading BMM050 addresses.

*/
#define BMM050_BUS_RD_RETURN_TYPE s8
#define BMM050_BUS_RD_PARAM_TYPES \
u8, u8, u8 *, u8
#define BMM050_BUS_RD_PARAM_ORDER (device_addr, register_addr, register_data)
#define BMM050_BUS_READ_FUNC(device_addr, register_addr, register_data, rd_len)\
bus_read(device_addr, register_addr, register_data, rd_len)
/***************************************************************/
/**\name	RETURN TYPE DEFINITIONS        */
/***************************************************************/
#define BMM050_DELAY_RETURN_TYPE void
#define BMM050_DELAY_FUNC(delay_in_msec) \
delay_func(delay_in_msec)
#define BMM050_RETURN_FUNCTION_TYPE        s8
/***************************************************************/
/**\name	I2C ADDRESS DEFINITIONS        */
/***************************************************************/
#define BMM050_I2C_ADDRESS                 (0x10)
/***************************************************************/
/**\name	REGISTER ADDRESS DEFINITION        */
/***************************************************************/
/********************************************/
/**\name	CHIP ID       */
/********************************************/
/* Fixed Data Registers */
#define BMM050_CHIP_ID                     (0x40)
/********************************************/
/**\name	DATA REGISTERS       */
/********************************************/
/* Data Registers*/
#define BMM050_DATA_X_LSB                   (0x42)
#define BMM050_DATA_X_MSB                   (0x43)
#define BMM050_DATA_Y_LSB                   (0x44)
#define BMM050_DATA_Y_MSB                   (0x45)
#define BMM050_DATA_Z_LSB                   (0x46)
#define BMM050_DATA_Z_MSB                   (0x47)
#define BMM050_DATA_R_LSB                   (0x48)
#define BMM050_DATA_R_MSB                   (0x49)
/********************************************/
/**\name	REMAPPED DATA REGISTERS      */
/********************************************/
/* Data Registers for remapped axis(XandY)
 * this only applicable for BMX055 */
#define BMM050_REMAPPED_BMX055_DATA_Y_LSB      (0x42)
#define BMM050_REMAPPED_BMX055_DATA_Y_MSB      (0x43)
#define BMM050_REMAPPED_BMX055_DATA_X_LSB      (0x44)
#define BMM050_REMAPPED_BMX055_DATA_X_MSB      (0x45)
/********************************************/
/**\name	INTERRUPT STATUS      */
/********************************************/
/* Status Registers */
#define BMM050_INT_STAT_REG                    (0x4A)
/********************************************/
/**\name	POWER MODE DEFINITIONS      */
/********************************************/
/* Control Registers */
#define BMM050_POWER_CONTROL               (0x4B)
#define BMM050_CONTROL                     (0x4C)
#define BMM050_INT_CONTROL                 (0x4D)
#define BMM050_SENS_CONTROL                (0x4E)
#define BMM050_LOW_THRES                   (0x4F)
#define BMM050_HIGH_THRES                  (0x50)
/********************************************/
/**\name XY AND Z REPETITIONS DEFINITIONS  */
/********************************************/
#define BMM050_REP_XY                      (0x51)
#define BMM050_REP_Z                       (0x52)
/********************************************/
/**\name	TRIM REGISTERS      */
/********************************************/
/* Trim Extended Registers */
#define BMM050_DIG_X1                      (0x5D)
#define BMM050_DIG_Y1                      (0x5E)
#define BMM050_DIG_Z4_LSB                  (0x62)
#define BMM050_DIG_Z4_MSB                  (0x63)
#define BMM050_DIG_X2                      (0x64)
#define BMM050_DIG_Y2                      (0x65)
#define BMM050_DIG_Z2_LSB                  (0x68)
#define BMM050_DIG_Z2_MSB                  (0x69)
#define BMM050_DIG_Z1_LSB                  (0x6A)
#define BMM050_DIG_Z1_MSB                  (0x6B)
#define BMM050_DIG_XYZ1_LSB                (0x6C)
#define BMM050_DIG_XYZ1_MSB                (0x6D)
#define BMM050_DIG_Z3_LSB                  (0x6E)
#define BMM050_DIG_Z3_MSB                  (0x6F)
#define BMM050_DIG_XY2                     (0x70)
#define BMM050_DIG_XY1                     (0x71)

/********************************************/
/**\name BIT MASK, LENGTH AND POSITION OF DATA REGISTERS   */
/********************************************/
/* Data X LSB Register */
#define BMM050_DATA_X_LSB_BIT__POS        (3)
#define BMM050_DATA_X_LSB_BIT__LEN        (5)
#define BMM050_DATA_X_LSB_BIT__MSK        (0xF8)
#define BMM050_DATA_X_LSB_BIT__REG        (BMM050_DATA_X_LSB)

/* Data X SelfTest Register */
#define BMM050_DATA_X_LSB_TESTX__POS         (0)
#define BMM050_DATA_X_LSB_TESTX__LEN         (1)
#define BMM050_DATA_X_LSB_TESTX__MSK         (0x01)
#define BMM050_DATA_X_LSB_TESTX__REG         (BMM050_DATA_X_LSB)

/* Data Y LSB Register */
#define BMM050_DATA_Y_LSB_BIT__POS        (3)
#define BMM050_DATA_Y_LSB_BIT__LEN        (5)
#define BMM050_DATA_Y_LSB_BIT__MSK        (0xF8)
#define BMM050_DATA_Y_LSB_BIT__REG        (BMM050_DATA_Y_LSB)

/* Data Y SelfTest Register */
#define BMM050_DATA_Y_LSB_TESTY__POS         (0)
#define BMM050_DATA_Y_LSB_TESTY__LEN         (1)
#define BMM050_DATA_Y_LSB_TESTY__MSK         (0x01)
#define BMM050_DATA_Y_LSB_TESTY__REG         (BMM050_DATA_Y_LSB)

/* Data Z LSB Register */
#define BMM050_DATA_Z_LSB_BIT__POS        (1)
#define BMM050_DATA_Z_LSB_BIT__LEN        (7)
#define BMM050_DATA_Z_LSB_BIT__MSK        (0xFE)
#define BMM050_DATA_Z_LSB_BIT__REG        (BMM050_DATA_Z_LSB)

/* Data Z SelfTest Register */
#define BMM050_DATA_Z_LSB_TESTZ__POS         (0)
#define BMM050_DATA_Z_LSB_TESTZ__LEN         (1)
#define BMM050_DATA_Z_LSB_TESTZ__MSK         (0x01)
#define BMM050_DATA_Z_LSB_TESTZ__REG         (BMM050_DATA_Z_LSB)

/* Hall Resistance LSB Register */
#define BMM050_DATA_R_LSB_BIT__POS             (2)
#define BMM050_DATA_R_LSB_BIT__LEN             (6)
#define BMM050_DATA_R_LSB_BIT__MSK             (0xFC)
#define BMM050_DATA_R_LSB_BIT__REG             (BMM050_DATA_R_LSB)

#define BMM050_DATA_RDYSTAT__POS            (0)
#define BMM050_DATA_RDYSTAT__LEN            (1)
#define BMM050_DATA_RDYSTAT__MSK            (0x01)
#define BMM050_DATA_RDYSTAT__REG            (BMM050_DATA_R_LSB)
/********************************************/
/**\name BIT MASK, LENGTH AND POSITION OF REMAPPED DATA REGISTERS   */
/********************************************/
/* Data X LSB Remapped Register only applicable for BMX055 */
#define BMM050_REMAPPED_BMX055_DATA_X_LSB_BIT__POS        (3)
#define BMM050_REMAPPED_BMX055_DATA_X_LSB_BIT__LEN        (5)
#define BMM050_REMAPPED_BMX055_DATA_X_LSB_BIT__MSK        (0xF8)
#define BMM050_REMAPPED_BMX055_DATA_X_LSB_BIT__REG\
(BMM050_REMAPPED_BMX055_DATA_X_LSB)

/* Data Y LSB Remapped Register only applicable for BMX055  */
#define BMM050_REMAPPED_BMX055_DATA_Y_LSB_BIT__POS        (3)
#define BMM050_REMAPPED_BMX055_DATA_Y_LSB_BIT__LEN        (5)
#define BMM050_REMAPPED_BMX055_DATA_Y_LSB_BIT__MSK        (0xF8)
#define BMM050_REMAPPED_BMX055_DATA_Y_LSB_BIT__REG\
(BMM050_REMAPPED_BMX055_DATA_Y_LSB)
/********************************************/
/**\name BIT MASK, LENGTH AND POSITION OF INTERRUPT STATUS REGISTERS   */
/********************************************/
/* Interrupt Status Register */
#define BMM050_INT_STAT_DOR__POS            (7)
#define BMM050_INT_STAT_DOR__LEN            (1)
#define BMM050_INT_STAT_DOR__MSK            (0x80)
#define BMM050_INT_STAT_DOR__REG            (BMM050_INT_STAT_REG)

#define BMM050_INT_STAT_OVRFLOW__POS        (6)
#define BMM050_INT_STAT_OVRFLOW__LEN        (1)
#define BMM050_INT_STAT_OVRFLOW__MSK        (0x40)
#define BMM050_INT_STAT_OVRFLOW__REG        (BMM050_INT_STAT_REG)

#define BMM050_INT_STAT_HIGH_THZ__POS       (5)
#define BMM050_INT_STAT_HIGH_THZ__LEN       (1)
#define BMM050_INT_STAT_HIGH_THZ__MSK       (0x20)
#define BMM050_INT_STAT_HIGH_THZ__REG       (BMM050_INT_STAT_REG)

#define BMM050_INT_STAT_HIGH_THY__POS       (4)
#define BMM050_INT_STAT_HIGH_THY__LEN       (1)
#define BMM050_INT_STAT_HIGH_THY__MSK       (0x10)
#define BMM050_INT_STAT_HIGH_THY__REG       (BMM050_INT_STAT_REG)

#define BMM050_INT_STAT_HIGH_THX__POS       (3)
#define BMM050_INT_STAT_HIGH_THX__LEN       (1)
#define BMM050_INT_STAT_HIGH_THX__MSK       (0x08)
#define BMM050_INT_STAT_HIGH_THX__REG       (BMM050_INT_STAT_REG)

#define BMM050_INT_STAT_LOW_THZ__POS        (2)
#define BMM050_INT_STAT_LOW_THZ__LEN        (1)
#define BMM050_INT_STAT_LOW_THZ__MSK        (0x04)
#define BMM050_INT_STAT_LOW_THZ__REG        (BMM050_INT_STAT_REG)

#define BMM050_INT_STAT_LOW_THY__POS        (1)
#define BMM050_INT_STAT_LOW_THY__LEN        (1)
#define BMM050_INT_STAT_LOW_THY__MSK        (0x02)
#define BMM050_INT_STAT_LOW_THY__REG        (BMM050_INT_STAT_REG)

#define BMM050_INT_STAT_LOW_THX__POS        (0)
#define BMM050_INT_STAT_LOW_THX__LEN        (1)
#define BMM050_INT_STAT_LOW_THX__MSK        (0x01)
#define BMM050_INT_STAT_LOW_THX__REG        (BMM050_INT_STAT_REG)
/********************************************/
/**\name BIT MASK, LENGTH AND POSITION OF SOFT RESET REGISTERS   */
/********************************************/
/* Power Control Register */
#define BMM050_POWER_CONTROL_SOFT_RST_7__POS       (7)
#define BMM050_POWER_CONTROL_SOFT_RST_7__LEN       (1)
#define BMM050_POWER_CONTROL_SOFT_RST_7__MSK       (0x80)
#define BMM050_POWER_CONTROL_SOFT_RST_7__REG       (BMM050_POWER_CONTROL)

#define BMM050_POWER_CONTROL_SPI3_ENABLE__POS     (2)
#define BMM050_POWER_CONTROL_SPI3_ENABLE__LEN     (1)
#define BMM050_POWER_CONTROL_SPI3_ENABLE__MSK     (0x04)
#define BMM050_POWER_CONTROL_SPI3_ENABLE__REG     (BMM050_POWER_CONTROL)

#define BMM050_POWER_CONTROL_SOFT_RST_1__POS       (1)
#define BMM050_POWER_CONTROL_SOFT_RST_1__LEN       (1)
#define BMM050_POWER_CONTROL_SOFT_RST_1__MSK       (0x02)
#define BMM050_POWER_CONTROL_SOFT_RST_1__REG       (BMM050_POWER_CONTROL)
/********************************************/
/**\name BIT MASK, LENGTH AND POSITION OF POWER MODE REGISTERS   */
/********************************************/
#define BMM050_POWER_CONTROL_POWER_CONTROL_BIT__POS         (0)
#define BMM050_POWER_CONTROL_POWER_CONTROL_BIT__LEN         (1)
#define BMM050_POWER_CONTROL_POWER_CONTROL_BIT__MSK         (0x01)
#define BMM050_POWER_CONTROL_POWER_CONTROL_BIT__REG         \
(BMM050_POWER_CONTROL)
/********************************************/
/**\name BIT MASK, LENGTH AND POSITION OF SELF TEST REGISTERS   */
/********************************************/
/* Control Register */
#define BMM050_CONTROL_ADVANCED_SELFTEST__POS            (6)
#define BMM050_CONTROL_ADVANCED_SELFTEST__LEN            (2)
#define BMM050_CONTROL_ADVANCED_SELFTEST__MSK            (0xC0)
#define BMM050_CONTROL_ADVANCED_SELFTEST__REG            (BMM050_CONTROL)
/********************************************/
/**\name BIT MASK, LENGTH AND POSITION OF DATA RATE REGISTERS   */
/********************************************/
#define BMM050_CONTROL_DATA_RATE__POS                (3)
#define BMM050_CONTROL_DATA_RATE__LEN                (3)
#define BMM050_CONTROL_DATA_RATE__MSK                (0x38)
#define BMM050_CONTROL_DATA_RATE__REG                (BMM050_CONTROL)
/********************************************/
/**\name BIT MASK, LENGTH AND POSITION OF OPERATION MODE REGISTERS   */
/********************************************/
#define BMM050_CONTROL_OPERATION_MODE__POS            (1)
#define BMM050_CONTROL_OPERATION_MODE__LEN            (2)
#define BMM050_CONTROL_OPERATION_MODE__MSK            (0x06)
#define BMM050_CONTROL_OPERATION_MODE__REG            (BMM050_CONTROL)
/********************************************/
/**\name BIT MASK, LENGTH AND POSITION OF SELF TEST REGISTERS   */
/********************************************/
#define BMM050_CONTROL_SELFTEST__POS            (0)
#define BMM050_CONTROL_SELFTEST__LEN            (1)
#define BMM050_CONTROL_SELFTEST__MSK            (0x01)
#define BMM050_CONTROL_SELFTEST__REG            (BMM050_CONTROL)
/********************************************/
/**\name BIT MASK, LENGTH AND POSITION OF INTERRUPT CONTROL REGISTERS   */
/********************************************/
/* Interrupt Control Register */
#define BMM050_INT_CONTROL_DOR_EN__POS            (7)
#define BMM050_INT_CONTROL_DOR_EN__LEN            (1)
#define BMM050_INT_CONTROL_DOR_EN__MSK            (0x80)
#define BMM050_INT_CONTROL_DOR_EN__REG            (BMM050_INT_CONTROL)

#define BMM050_INT_CONTROL_OVRFLOW_EN__POS        (6)
#define BMM050_INT_CONTROL_OVRFLOW_EN__LEN        (1)
#define BMM050_INT_CONTROL_OVRFLOW_EN__MSK        (0x40)
#define BMM050_INT_CONTROL_OVRFLOW_EN__REG        (BMM050_INT_CONTROL)

#define BMM050_INT_CONTROL_HIGH_THZ_EN__POS       (5)
#define BMM050_INT_CONTROL_HIGH_THZ_EN__LEN       (1)
#define BMM050_INT_CONTROL_HIGH_THZ_EN__MSK       (0x20)
#define BMM050_INT_CONTROL_HIGH_THZ_EN__REG       (BMM050_INT_CONTROL)

#define BMM050_INT_CONTROL_HIGH_THY_EN__POS       (4)
#define BMM050_INT_CONTROL_HIGH_THY_EN__LEN       (1)
#define BMM050_INT_CONTROL_HIGH_THY_EN__MSK       (0x10)
#define BMM050_INT_CONTROL_HIGH_THY_EN__REG       (BMM050_INT_CONTROL)

#define BMM050_INT_CONTROL_HIGH_THX_EN__POS       (3)
#define BMM050_INT_CONTROL_HIGH_THX_EN__LEN       (1)
#define BMM050_INT_CONTROL_HIGH_THX_EN__MSK       (0x08)
#define BMM050_INT_CONTROL_HIGH_THX_EN__REG       (BMM050_INT_CONTROL)

#define BMM050_INT_CONTROL_LOW_THZ_EN__POS        (2)
#define BMM050_INT_CONTROL_LOW_THZ_EN__LEN        (1)
#define BMM050_INT_CONTROL_LOW_THZ_EN__MSK        (0x04)
#define BMM050_INT_CONTROL_LOW_THZ_EN__REG        (BMM050_INT_CONTROL)

#define BMM050_INT_CONTROL_LOW_THY_EN__POS        (1)
#define BMM050_INT_CONTROL_LOW_THY_EN__LEN        (1)
#define BMM050_INT_CONTROL_LOW_THY_EN__MSK        (0x02)
#define BMM050_INT_CONTROL_LOW_THY_EN__REG        (BMM050_INT_CONTROL)

#define BMM050_INT_CONTROL_LOW_THX_EN__POS        (0)
#define BMM050_INT_CONTROL_LOW_THX_EN__LEN        (1)
#define BMM050_INT_CONTROL_LOW_THX_EN__MSK        (0x01)
#define BMM050_INT_CONTROL_LOW_THX_EN__REG        (BMM050_INT_CONTROL)

/* Sensor Control Register */
#define BMM050_SENS_CONTROL_DRDY_EN__POS          (7)
#define BMM050_SENS_CONTROL_DRDY_EN__LEN          (1)
#define BMM050_SENS_CONTROL_DRDY_EN__MSK          (0x80)
#define BMM050_SENS_CONTROL_DRDY_EN__REG          (BMM050_SENS_CONTROL)

#define BMM050_SENS_CONTROL_IE__POS               (6)
#define BMM050_SENS_CONTROL_IE__LEN               (1)
#define BMM050_SENS_CONTROL_IE__MSK               (0x40)
#define BMM050_SENS_CONTROL_IE__REG               BMM050_SENS_CONTROL

#define BMM050_SENS_CONTROL_CHANNELZ__POS         (5)
#define BMM050_SENS_CONTROL_CHANNELZ__LEN         (1)
#define BMM050_SENS_CONTROL_CHANNELZ__MSK         (0x20)
#define BMM050_SENS_CONTROL_CHANNELZ__REG         (BMM050_SENS_CONTROL)

#define BMM050_SENS_CONTROL_CHANNELY__POS         (4)
#define BMM050_SENS_CONTROL_CHANNELY__LEN         (1)
#define BMM050_SENS_CONTROL_CHANNELY__MSK         (0x10)
#define BMM050_SENS_CONTROL_CHANNELY__REG         (BMM050_SENS_CONTROL)

#define BMM050_SENS_CONTROL_CHANNELX__POS         (3)
#define BMM050_SENS_CONTROL_CHANNELX__LEN         (1)
#define BMM050_SENS_CONTROL_CHANNELX__MSK         (0x08)
#define BMM050_SENS_CONTROL_CHANNELX__REG         (BMM050_SENS_CONTROL)

#define BMM050_SENS_CONTROL_DR_POLARITY__POS      (2)
#define BMM050_SENS_CONTROL_DR_POLARITY__LEN      (1)
#define BMM050_SENS_CONTROL_DR_POLARITY__MSK      (0x04)
#define BMM050_SENS_CONTROL_DR_POLARITY__REG      (BMM050_SENS_CONTROL)

#define BMM050_SENS_CONTROL_INTERRUPT_LATCH__POS    (1)
#define BMM050_SENS_CONTROL_INTERRUPT_LATCH__LEN    (1)
#define BMM050_SENS_CONTROL_INTERRUPT_LATCH__MSK    (0x02)
#define BMM050_SENS_CONTROL_INTERRUPT_LATCH__REG    (BMM050_SENS_CONTROL)

#define BMM050_SENS_CONTROL_INTERRUPT_POLARITY__POS         (0)
#define BMM050_SENS_CONTROL_INTERRUPT_POLARITY__LEN         (1)
#define BMM050_SENS_CONTROL_INTERRUPT_POLARITY__MSK         (0x01)
#define BMM050_SENS_CONTROL_INTERRUPT_POLARITY__REG         \
(BMM050_SENS_CONTROL)
/********************************************/
/**\name BIT MASK, LENGTH AND POSITION OF TRIM REGISTER   */
/********************************************/
/* Register 6D */
#define BMM050_DIG_XYZ1_MSB__POS         (0)
#define BMM050_DIG_XYZ1_MSB__LEN         (7)
#define BMM050_DIG_XYZ1_MSB__MSK         (0x7F)
#define BMM050_DIG_XYZ1_MSB__REG         (BMM050_DIG_XYZ1_MSB)
/*****************************************************************/
/********************************************/
/**\name CONSTANTS DEFINITIONS  */
/********************************************/
/********************************************/
/**\name ERROR CODE */
/********************************************/

/** Error code definitions**/
#define E_BMM050_NULL_PTR           ((s8)-127)
#define BMM050_ERROR                ((s8)-1)
#define E_BMM050_OUT_OF_RANGE       ((s8)-2)
#define BMM050_NULL                 ((u8)0)
#define E_BMM050_UNDEFINED_MODE     (0)

/********************************************/
/**\name RESET DEFINITIONS */
/********************************************/
/*General Info data's*/
#define BMM050_SOFT_RESET7_ON              (1)
#define BMM050_SOFT_RESET1_ON              (1)
#define BMM050_SOFT_RESET7_OFF             (0)
#define BMM050_SOFT_RESET1_OFF             (0)
#define BMM050_DELAY_SOFTRESET             (1)

/********************************************/
/**\name DELAY DEFINITIONS  */
/********************************************/
/* Constants */
#define BMM050_DELAY_POWEROFF_SUSPEND      (1)
#define BMM050_DELAY_SUSPEND_SLEEP         (3)
#define BMM050_DELAY_SLEEP_ACTIVE          (1)
#define BMM050_DELAY_ACTIVE_SLEEP          (1)
#define BMM050_DELAY_SLEEP_SUSPEND         (1)
#define BMM050_DELAY_ACTIVE_SUSPEND        (1)
#define BMM050_DELAY_SLEEP_POWEROFF        (1)
#define BMM050_DELAY_ACTIVE_POWEROFF       (1)
#define BMM050_DELAY_SETTLING_TIME         (3)
#define BMM050_MDELAY_DATA_TYPE			  u32
/********************************************/
/**\name XYZ AXIS DEFINITIONS  */
/********************************************/
#define BMM050_X_AXIS               (0)
#define BMM050_Y_AXIS               (1)
#define BMM050_Z_AXIS               (2)
#define BMM050_RESISTANCE           (3)
#define BMM050_X                    (1)
#define BMM050_Y                    (2)
#define BMM050_Z                    (4)
#define BMM050_XYZ                  (7)
/********************************************/
/**\name ENABLE/DISABLE DEFINITIONS  */
/********************************************/
#define BMM050_CHANNEL_DISABLE                  (1)
#define BMM050_CHANNEL_ENABLE                   (0)
#define BMM050_OFF                              (0)
#define BMM050_ON                               (1)
/********************************************/
/**\name POWER MODE DEFINITIONS  */
/********************************************/
#define BMM050_NORMAL_MODE                      (0x00)
#define BMM050_FORCED_MODE                      (0x01)
#define BMM050_SUSPEND_MODE                     (0x02)
#define BMM050_SLEEP_MODE                       (0x03)
/********************************************/
/**\name SELF TEST DEFINITIONS  */
/********************************************/
#define BMM050_ADVANCED_SELFTEST_OFF            (0)
#define BMM050_ADVANCED_SELFTEST_NEGATIVE       (2)
#define BMM050_ADVANCED_SELFTEST_POSITIVE       (3)

#define BMM050_NEGATIVE_SATURATION_Z            (-32767)
#define BMM050_POSITIVE_SATURATION_Z            (32767)
/********************************************/
/**\name SPI READ/WRITE DEFINITIONS  */
/********************************************/
#define BMM050_SPI_RD_MASK                      (0x80)
#define BMM050_READ_SET                         (0x01)
/********************************************/
/**\name READ AND WRITE FUNCTION POINTERS  */
/********************************************/
/* Bus read and bus write */
#define BMM050_WR_FUNC_PTR \
	s8 (*bus_write)(u8, u8, \
	u8 *, u8)

#define BMM050_RD_FUNC_PTR \
	s8 (*bus_read)(u8, u8, \
	u8 *, u8)

/********************************************/
/**\name NUMERIC DEFINITIONS  */
/********************************************/
#define  BMM050_GEN_READ_WRITE_DATA_LENGTH		((u8)1)
#define  BMM050_TRIM_DATA_LENGTH		((u8)2)
#define  BMM050_SELFTEST_DELAY			((u8)4)
#define  BMM050_SELFTEST_DATA_LENGTH	((u8)5)
#define  BMM050_ALL_DATA_FRAME_LENGTH	((u8)8)
/**< Frame length refers the
x,y,z and r values*/
#define BMM050_INIT_VALUE               (0)

/********************************************/
/**\name GET AND SET BITSLICE FUNCTIONS  */
/********************************************/
/* get bit slice  */
#define BMM050_GET_BITSLICE(regvar, bitname)\
	((regvar & bitname##__MSK) >> bitname##__POS)

/* Set bit slice */
#define BMM050_SET_BITSLICE(regvar, bitname, val)\
	((regvar & ~bitname##__MSK) | ((val<<bitname##__POS)&bitname##__MSK))

/********************************************/
/**\name OVERFLOW DEFINITIONS  */
/********************************************/
/* compensated output value returned if sensor had overflow */
#define BMM050_OVERFLOW_OUTPUT			-32768
#define BMM050_OVERFLOW_OUTPUT_S32		((s32)(-2147483647-1))
#define BMM050_OVERFLOW_OUTPUT_FLOAT	0.0f
#define BMM050_FLIP_OVERFLOW_ADCVAL		-4096
#define BMM050_HALL_OVERFLOW_ADCVAL		-16384
/********************************************/
/**\name PRESET MODE DEFINITIONS  */
/********************************************/
#define BMM050_PRESETMODE_LOWPOWER                  (1)
#define BMM050_PRESETMODE_REGULAR                   (2)
#define BMM050_PRESETMODE_HIGHACCURACY              (3)
#define BMM050_PRESETMODE_ENHANCED                  (4)

/* PRESET MODES - DATA RATES */
#define BMM050_LOWPOWER_DR                       (BMM050_DR_10HZ)
#define BMM050_REGULAR_DR                        (BMM050_DR_10HZ)
#define BMM050_HIGHACCURACY_DR                   (BMM050_DR_20HZ)
#define BMM050_ENHANCED_DR                       (BMM050_DR_10HZ)

/* PRESET MODES - REPETITIONS-XY RATES */
#define BMM050_LOWPOWER_REPXY                     (1)
#define BMM050_REGULAR_REPXY                      (4)
#define BMM050_HIGHACCURACY_REPXY                (23)
#define BMM050_ENHANCED_REPXY                     (7)

/* PRESET MODES - REPETITIONS-Z RATES */
#define BMM050_LOWPOWER_REPZ                      (2)
#define BMM050_REGULAR_REPZ                      (14)
#define BMM050_HIGHACCURACY_REPZ                 (82)
#define BMM050_ENHANCED_REPZ                     (26)
/********************************************/
/**\name DATA RATE DEFINITIONS  */
/********************************************/
/* Data Rates */
#define BMM050_DR_10HZ                     (0)
#define BMM050_DR_02HZ                     (1)
#define BMM050_DR_06HZ                     (2)
#define BMM050_DR_08HZ                     (3)
#define BMM050_DR_15HZ                     (4)
#define BMM050_DR_20HZ                     (5)
#define BMM050_DR_25HZ                     (6)
#define BMM050_DR_30HZ                     (7)

#define BMM050_DATA_RATE_10HZ        (0x00)
#define BMM050_DATA_RATE_02HZ        (0x01)
#define BMM050_DATA_RATE_06HZ        (0x02)
#define BMM050_DATA_RATE_08HZ        (0x03)
#define BMM050_DATA_RATE_15HZ        (0x04)
#define BMM050_DATA_RATE_20HZ        (0x05)
#define BMM050_DATA_RATE_25HZ        (0x06)
#define BMM050_DATA_RATE_30HZ        (0x07)

/********************************************/
/**\name BIT SHIFTING DEFINITIONS  */
/********************************************/
/*Shifting Constants*/
#define BMM050_SHIFT_BIT_POSITION_BY_01_BIT     (1)
#define BMM050_SHIFT_BIT_POSITION_BY_02_BITS    (2)
#define BMM050_SHIFT_BIT_POSITION_BY_03_BITS    (3)
#define BMM050_SHIFT_BIT_POSITION_BY_05_BITS    (5)
#define BMM050_SHIFT_BIT_POSITION_BY_06_BITS    (6)
#define BMM050_SHIFT_BIT_POSITION_BY_07_BITS    (7)
#define BMM050_SHIFT_BIT_POSITION_BY_08_BITS    (8)
#define BMM050_SHIFT_BIT_POSITION_BY_09_BITS    (9)
#define BMM050_SHIFT_BIT_POSITION_BY_12_BITS    (12)
#define BMM050_SHIFT_BIT_POSITION_BY_13_BITS    (13)
#define BMM050_SHIFT_BIT_POSITION_BY_16_BITS    (16)
#define BMM050_SHIFT_BIT_POSITION_BY_14_BITS    (14)
#define BMM050_SHIFT_BIT_POSITION_BY_15_BITS    (15)
/****************************************************/
/**\name	ARRAY SIZE DEFINITIONS      */
/***************************************************/
#define	BMM050_DATA_FRAME_SIZE		(8)
#define	BMM050_INIT_DATA_SIZE		(2)
#define	BMM050_CHIP_ID_DATA			(0)
#define	BMM050_SELFTEST_DATA_SIZE	(5)
#define	BMM050_TRIM_DATA_SIZE		(2)
#define	BMM050_XLSB_DATA			(0)
#define	BMM050_XMSB_DATA			(1)
#define	BMM050_YLSB_DATA			(2)
#define	BMM050_YMSB_DATA			(3)
#define	BMM050_ZLSB_DATA			(4)
#define	BMM050_ZMSB_DATA			(5)
#define	BMM050_RLSB_DATA			(6)
#define	BMM050_RMSB_DATA			(7)
#define	BMM050_TRIM_DIG_Z1_LSB_DATA	(0)
#define	BMM050_TRIM_DIG_Z1_MSB_DATA	(1)
#define	BMM050_TRIM_DIG_Z2_LSB_DATA	(0)
#define	BMM050_TRIM_DIG_Z2_MSB_DATA	(1)
#define	BMM050_TRIM_DIG_Z3_LSB_DATA	(0)
#define	BMM050_TRIM_DIG_Z3_MSB_DATA	(1)
#define	BMM050_TRIM_DIG_Z4_LSB_DATA	(0)
#define	BMM050_TRIM_DIG_Z4_MSB_DATA	(1)
#define	BMM050_TRIM_DIG_XYZ1_LSB_DATA	(0)
#define	BMM050_TRIM_DIG_XYZ1_MSB_DATA	(1)
#define	BMM050_REMAPPED_YLSB_DATA			(0)
#define	BMM050_REMAPPED_YMSB_DATA			(1)
#define	BMM050_REMAPPED_XLSB_DATA			(2)
#define	BMM050_REMAPPED_XMSB_DATA			(3)

/********************************************/
/**\name STRUCTURE DEFINITIONS  */
/********************************************/
/*!
 * @brief Structure containing mag xyz data
 * output of the data is s16
 */
struct bmm050_mag_data_s16_t {
	s16 datax;/**<mag compensated X  data*/
	s16 datay;/**<mag compensated Y  data*/
	s16 dataz;/**<mag compensated Z  data*/
	u16 resistance;/**<mag R  data*/
	u8 data_ready;/**<mag data ready status*/
};
/*!
 * @brief Structure containing mag xyz data
 * output of the data is s32
 */
struct bmm050_mag_s32_data_t {
	s32 datax;/**<mag compensated X  data*/
	s32 datay;/**<mag compensated Y  data*/
	s32 dataz;/**<mag compensated Z  data*/
	u16 resistance;/**<mag R  data*/
	u8 data_ready;/**<mag data ready status*/
};
/*!
 * @brief Structure containing mag xyz data
 * output of the data is float
 */
struct bmm050_mag_data_float_t {
	float datax;/**<mag compensated X  data*/
	float datay;/**<mag compensated Y  data*/
	float  dataz;/**<mag compensated Z  data*/
	u16 resistance;/**<mag R  data*/
	u8 data_ready;/**<mag data ready status*/
};
/*!
 * @brief Structure containing mag remapped xyz data
 * output of the data is s16
 * this only applicable for BMX055 sensor
 */
struct bmm050_remapped_mag_s16_data_t {
	s16 datax;/**<mag compensated remapped X  data*/
	s16 datay;/**<mag compensated remapped Y  data*/
	s16 dataz;/**<mag compensated Z  data*/
	u16 resistance;/**<mag R  data*/
	u8 data_ready;/**<mag data ready status*/
};
/*!
 * @brief Structure containing mag remapped xyz data
 * output of the data is s32
 * this only applicable for BMX055 sensor
 */
struct bmm050_remapped_mag_s32_data_t {
	s32 datax;/**<mag compensated remapped X  data*/
	s32 datay;/**<mag compensated remapped Y  data*/
	s32 dataz;/**<mag compensated Z  data*/
	u16 resistance;/**<mag R  data*/
	u8 data_ready;/**<mag data ready status*/
};
/*!
 * @brief Structure containing mag remapped xyz data
 * output of the data is float
 * this only applicable for BMX055 sensor
 */
struct bmm050_remapped_mag_data_float_t {
	float datax;/**<mag compensated remapped X  data*/
	float datay;/**<mag compensated remapped Y  data*/
	float  dataz;/**<mag compensated Z  data*/
	u16 resistance;/**<mag R  data*/
	u8 data_ready;/**<mag data ready status*/
};
/*!
 * @brief Structure containing mag initial parameters
 */
struct bmm050 {
	u8 company_id;/**<mag chip id*/
	u8 dev_addr;/**<mag device address*/

	BMM050_WR_FUNC_PTR;/**< bus write function pointer*/
	BMM050_RD_FUNC_PTR;/**< bus read function pointer*/
	void (*delay_msec)(BMM050_MDELAY_DATA_TYPE);/**< delay function pointer*/

	s8 dig_x1;/**< trim x1 data */
	s8 dig_y1;/**< trim y1 data */

	s8 dig_x2;/**< trim x2 data */
	s8 dig_y2;/**< trim y2 data */

	u16 dig_z1;/**< trim z1 data */
	s16 dig_z2;/**< trim z2 data */
	s16 dig_z3;/**< trim z3 data */
	s16 dig_z4;/**< trim z4 data */

	u8 dig_xy1;/**< trim xy1 data */
	s8 dig_xy2;/**< trim xy2 data */

	u16 dig_xyz1;/**< trim xyz1 data */
};
/********************************************/
/**\name FUNCTION DECLARATIONS  */
/********************************************/
/********************************************/
/**\name INITIALIZATION  */
/********************************************/
/*!
 *	@brief This function is used for initialize
 *	bus read and bus write functions
 *	assign the chip id and device address
 *	chip id is read in the register 0x40 bit from 0 to 7
 *
 *	@note While changing the parameter of the bmm050
 *	consider the following point:
 *	@note Changing the reference value of the parameter
 *	will changes the local copy or local reference
 *	make sure your changes will not
 *	affect the reference value of the parameter
 *	(Better case don't change the reference value of the parameter)
 *
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_init(struct bmm050 *bmm050);
/********************************************/
/**\name DATA READ FUNCTIONS  */
/********************************************/
/*!
 * @brief This API reads compensated Magnetometer
 * data of X,Y,Z values
 * from location 0x42 to 0x49
 *
 *
 *
 *
 *  @param  mag_data : The data of mag compensated XYZ data
 *
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_read_mag_data_XYZ(
struct bmm050_mag_data_s16_t *mag_data);
/*!
 *	@brief This API reads remapped compensated Magnetometer
 *	data of X,Y,Z values
 *	@note In this function X and Y axis is remapped
 *	@note X is read from the address 0x44 & 0x45
 *	@note Y is read from the address 0x42 & 0x43
 *	@note this API is only applicable for BMX055 sensor
 *
 *
 *
 *  @param  mag_data : The data of remapped compensated mag xyz data
 *
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_read_bmx055_remapped_mag_data_XYZ(
struct bmm050_remapped_mag_s16_data_t *mag_data);
/*!
 *	@brief This API reads compensated magnetometer
 *	data of X,Y,Z values
 *	@note The output value of compensated X, Y, Z  as s32
 *
 *
 *  @param mag_data : The data of compensated XYZ data
 *
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_read_mag_data_XYZ_s32(
struct bmm050_mag_s32_data_t *mag_data);
/*!
 *	@brief This API reads remapped compensated magnetometer
 *	data of X,Y,Z values
 *	@note The output value of compensated X, Y, Z  as s32
 *	@note In this function X and Y axis is remapped
 *	@note X is read from the address 0x44 & 0x45
 *	@note Y is read from the address 0x42 & 0x43
 *	@note this API is only applicable for BMX055 sensor
 *
 *
 *  @param mag_data : The data of remapped compensated XYZ data
 *
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_read_bmx055_remapped_mag_data_XYZ_s32(
struct bmm050_remapped_mag_s32_data_t *mag_data);
#ifdef ENABLE_FLOAT
/*!
 *	@brief This API reads compensated Magnetometer
 *	data of X,Y,Z values
 *	@note The output value of compensated X, Y, Z as float
 *
 *
 *
 *  @param mag_data : The value of compensated XYZ float data
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_read_mag_data_XYZ_float(
struct bmm050_mag_data_float_t *mag_data);
#endif
#ifdef ENABLE_FLOAT
/*!
 *	@brief This API reads remapped compensated Magnetometer
 *	data of X,Y,Z values
 *	@note The output value of compensated X, Y, Z as float
 *
 *	@note In this function X and Y axis is remapped
 *	@note X is read from the address 0x44 & 0x45
 *	@note Y is read from the address 0x42 & 0x43
 *	@note this API is only applicable for BMX055 sensor
 *
 *  @param mag_data : The value of remapped compensated XYZ float data
 *
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_read_bmx055_remapped_mag_data_XYZ_float(
struct bmm050_remapped_mag_data_float_t *mag_data);
#endif
/********************************************/
/**\name COMMON READ AND WRITE FUNCTIONS  */
/********************************************/
/*!
 * @brief
 *	This API reads the data from
 *	the given register
 *
 *
 *	@param v_addr_u8 -> Address of the register
 *	@param v_data_u8 -> The data from the register
 *	@param v_len_u8 -> no of bytes to read
 *
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
 *
 */
BMM050_RETURN_FUNCTION_TYPE bmm050_read_register(u8 v_addr_u8,
u8 *v_data_u8, u8 v_len_u8);
/*!
 * @brief
 *	This API write the data to
 *	the given register
 *
 *
 *	@param v_addr_u8 -> Address of the register
 *	@param v_data_u8 -> The data from the register
 *	@param v_len_u8 -> no of bytes to read
 *
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
 *
 */
BMM050_RETURN_FUNCTION_TYPE bmm050_write_register(u8 v_addr_u8,
u8 *v_data_u8, u8 v_len_u8);
/********************************************/
/**\name SELF TEST FUNCTION  */
/********************************************/
/*!
 *	@brief This API used to set the self test of the sensor
 *	in the register 0x4C bit 0
 *
 *
 *
 *  @param  v_selftest_u8 : The value of selftest
 *	@note write 0x01 to start self test
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_set_selftest(u8 v_selftest_u8);
/*!
 *	@brief This API used to read the selftest of the sensor
 *
 *
 *
 *
 *  @param v_selftest_xyz: The self test value of XYZ
 *
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_get_selftest_XYZ(
u8 *v_selftest_xyz);
/********************************************/
/**\name SPI ENABLE FUNCTION  */
/********************************************/
/*!
 *	@brief This API used to set the spi3
 *	in the register 0x4B bit 2
 *
 *
 *
 *  @param  v_value_u8 : the value of spi3
 *  value  | Description
 * --------|------------
 *   0     | Disable
 *   1     | Enable
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_set_spi3(u8 v_value_u8);
/********************************************/
/**\name DATA RATE FUNCTIONS  */
/********************************************/
/*!
 *	@brief This API used to set the data rate of the sensor
 *	in the register 0x4C bit 3 to 5
 *
 *
 *
 *  @param  v_data_rate_u8 : The value of data rate
 *  value     |       Description
 * -----------|-----------------------
 *   0x00     |  BMM050_DATA_RATE_10HZ
 *   0x01     |  BMM050_DATA_RATE_02HZ
 *   0x02     |  BMM050_DATA_RATE_06HZ
 *   0x03     |  BMM050_DATA_RATE_08HZ
 *   0x04     |  BMM050_DATA_RATE_15HZ
 *   0x05     |  BMM050_DATA_RATE_20HZ
 *   0x06     |  BMM050_DATA_RATE_25HZ
 *   0x07     |  BMM050_DATA_RATE_30HZ
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_set_data_rate(u8 v_data_rate_u8);
/*!
 *	@brief This API used to get the data rate of the sensor
 *	in the register 0x4C bit 3 to 5
 *
 *
 *
 *  @param  v_data_rate_u8 : The value of data rate
 *  value     |       Description
 * -----------|-----------------------
 *   0x00     |  BMM050_DATA_RATE_10HZ
 *   0x01     |  BMM050_DATA_RATE_02HZ
 *   0x02     |  BMM050_DATA_RATE_06HZ
 *   0x03     |  BMM050_DATA_RATE_08HZ
 *   0x04     |  BMM050_DATA_RATE_15HZ
 *   0x05     |  BMM050_DATA_RATE_20HZ
 *   0x06     |  BMM050_DATA_RATE_25HZ
 *   0x07     |  BMM050_DATA_RATE_30HZ
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_get_data_rate(u8 *v_data_rate_u8);
/********************************************/
/**\name FUNCTIONAL STATE FUNCTION  */
/********************************************/
/*!
 *	@brief This API used to set the functional state
 *	in the register 0x4C and 0x4B
 *	@note 0x4C bit 1 and 2
 *	@note 0x4B bit 0
 *
 *
 *  @param  v_functional_state_u8: The value of functional mode
 *  value     |   functional state
 * -----------|-------------------
 *   0x00     | BMM050_NORMAL_MODE
 *   0x01     | BMM050_SUSPEND_MODE
 *   0x02     | BMM050_FORCED_MODE
 *   0x03     | BMM050_SLEEP_MODE
 *
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_set_functional_state(
u8 v_functional_state_u8);
/*!
 *	@brief This API used to get the functional state
 *	in the register 0x4C bit 1 and 2
 *
 *
 *
 *
 *  @param v_functional_state_u8: The value of functional mode
 *  value     |  functional state
 * -----------|--------------------
 *    0x00    |  Normal
 *    0x03    |  Sleep
 *	@note If user set the functional state as Force mode(0x01) and read the
 *	register it returns the value as 0x03 that is sleep mode.
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_get_functional_state(
u8 *v_functional_state_u8);
/********************************************/
/**\name ADVANCED SELFTEST  */
/********************************************/
/*!
 *	@brief This API used to perform the
 *	advanced self test
 *
 *
 *
 *  @param v_diff_z_s16 : The output of advance self test
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_perform_advanced_selftest(
s16 *v_diff_z_s16);
/********************************************/
/**\name TRIM REGISTER  */
/********************************************/
/*!
 *	@brief This API used to get the trim values
 *
 *
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 */
BMM050_RETURN_FUNCTION_TYPE bmm050_init_trim_registers(void);
/********************************************/
/**\name SET ADVANCED SELFTEST  */
/********************************************/
/*!
 *	@brief This API used to set the advanced self test
 *	in the register 0x4C bit 6 and 7
 *
 *
 *
 *  @param  v_advanced_selftest_u8 : The output value of advanced self test
 *    value      |   Status
 *  -------------|-------------------
 *       0       |  BMM050_ADVANCED_SELFTEST_OFF
 *       2       |  BMM050_ADVANCED_SELFTEST_NEGATIVE
 *       3       |  BMM050_ADVANCED_SELFTEST_POSITIVE
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_set_advanced_selftest(
u8 v_advanced_selftest_u8);
/*!
 *	@brief This API used to get the advanced self test
 *	in the register 0x4C bit 6 and 7
 *
 *
 *
 *  @param  v_advanced_selftest_u8 : The output value of advanced self test
 *    value      |   Status
 *  -------------|-------------------
 *       0       |  BMM050_ADVANCED_SELFTEST_OFF
 *       2       |  BMM050_ADVANCED_SELFTEST_NEGATIVE
 *       3       |  BMM050_ADVANCED_SELFTEST_POSITIVE
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_get_advanced_selftest(
u8 *v_advanced_selftest_u8);
/********************************************/
/**\name POWER MODE   */
/********************************************/
/*!
 *	@brief This API used to get the power control bit
 *	in the register 0x4B bit 0
 *
 *
 *
 *  @param v_power_mode_u8 : The value of power control bit enable
 *   value     |  status
 *  -----------|------------
 *      0      | Disable the power control bit
 *      1      | Enable the power control bit
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_get_power_mode(u8 *v_power_mode_u8);
/*!
 *	@brief This API used to set the power control bit
 *	in the register 0x4B bit 0
 *
 *
 *
 *  @param v_power_mode_u8 : The value of power control bit enable
 *   value     |  status
 *  -----------|------------
 *      0      | Disable the power control bit
 *      1      | Enable the power control bit
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_set_power_mode(u8 v_power_mode_u8);
/********************************************/
/**\name XY AND Z REPETITIONS */
/********************************************/
/*!
 *	@brief This API used to get the x and y
 *	repetition in the register 0x51 bit 0 to 7
 *
 *
 *
 *  @param v_rep_xy_u8 : The value of x and y repetitions
 *
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_get_rep_XY(
u8 *v_rep_xy_u8);
/*!
 *	@brief This API used to set the x and y
 *	repetition in the register 0x51 bit 0 to 7
 *
 *
 *
 *  @param v_rep_xy_u8 : The value of x and y repetitions
 *
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_set_rep_XY(
u8 v_rep_xy_u8);
/*!
 *	@brief This API used to get the z repetition in the
 *	register 0x52 bit 0 to 7
 *
 *
 *
 *  @param v_rep_z_u8 : The value of z repetitions
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_get_rep_Z(
u8 *v_rep_z_u8);
/*!
 *	@brief This API used to set the z repetition in the
 *	register 0x52 bit 0 to 7
 *
 *
 *
 *  @param v_rep_z_u8 : The value of z repetitions
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_set_rep_Z(
u8 v_rep_z_u8);
/********************************************/
/**\name PRESET MODE  */
/********************************************/
/*!
 *	@brief This API used to get the preset modes
 *
 *	@note The preset mode setting is
 *	depend on Data Rate, XY and Z repetitions
 *
 *
 *
 *  @param v_presetmode_u8: The value of selected preset mode
 *  value    | preset_mode
 * ----------|-----------------
 *    1      | BMM050_PRESETMODE_LOWPOWER
 *    2      | BMM050_PRESETMODE_REGULAR
 *    3      | BMM050_PRESETMODE_HIGHACCURACY
 *    4      | BMM050_PRESETMODE_ENHANCED
 *
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_get_presetmode(
u8 *v_presetmode_u8);
/*!
 *	@brief This API used to set the preset modes
 *
 *	@note The preset mode setting is
 *	depend on Data Rate, XY and Z repetitions
 *
 *
 *
 *  @param v_presetmode_u8: The value of selected preset mode
 *  value    | preset_mode
 * ----------|-----------------
 *    1      | BMM050_PRESETMODE_LOWPOWER
 *    2      | BMM050_PRESETMODE_REGULAR
 *    3      | BMM050_PRESETMODE_HIGHACCURACY
 *    4      | BMM050_PRESETMODE_ENHANCED
 *
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_set_presetmode(u8 v_presetmode_u8);
/********************************************/
/**\name COMPENSATE X DATA   */
/********************************************/
/*!
 *	@brief This API used to get the compensated X data
 *	the out put of X as s16
 *
 *
 *
 *  @param  mag_data_x : The value of raw X data
 *	@param  data_r : The value of R data
 *
 *	@return results of compensated X data value output as s16
 *
*/
s16 bmm050_compensate_X(s16 mag_data_x, u16 data_r);
/*!
 *	@brief This API used to get the compensated X data
 *	the out put of X as s32
 *
 *
 *
 *  @param  mag_data_x : The value of raw X data
 *	@param  data_r : The value of R data
 *
 *	@return results of compensated X data value output as s32
 *
*/
s32 bmm050_compensate_X_s32(s16 mag_data_x, u16 data_r);
#ifdef ENABLE_FLOAT
/*!
 *	@brief This API used to get the compensated X data
 *	the out put of X as float
 *
 *
 *
 *  @param  mag_data_x : The value of raw X data
 *	@param  data_r : The value of R data
 *
 *	@return results of compensated X data value output as float
 *
*/
float bmm050_compensate_X_float(s16 mag_data_x, u16 data_r);
#endif
/********************************************/
/**\name COMPENSATE Y DATA   */
/********************************************/
/*!
 *	@brief This API used to get the compensated Y data
 *	the out put of Y as s16
 *
 *
 *
 *  @param  mag_data_y : The value of raw Y data
 *	@param  data_r : The value of R data
 *
 *	@return results of compensated Y data value output as s16
 *
*/
s16 bmm050_compensate_Y(s16 mag_data_y, u16 data_r);
/*!
 *	@brief This API used to get the compensated Y data
 *	the out put of Y as s32
 *
 *
 *
 *  @param  mag_data_y : The value of raw Y data
 *	@param  data_r : The value of R data
 *
 *	@return results of compensated Y data value output as s32
 *
*/
s32 bmm050_compensate_Y_s32(s16 mag_data_y, u16 data_r);
#ifdef ENABLE_FLOAT
/*!
 *	@brief This API used to get the compensated Y data
 *	the out put of Y as float
 *
 *
 *
 *  @param  mag_data_y : The value of raw Y data
 *	@param  data_r : The value of R data
 *
 *	@return results of compensated Y data value output as float
 *
*/
float bmm050_compensate_Y_float(s16 mag_data_y, u16 data_r);
#endif
/********************************************/
/**\name COMPENSATE Z DATA   */
/********************************************/
/*!
 *	@brief This API used to get the compensated Z data
 *	the out put of Z as s16
 *
 *
 *
 *  @param  mag_data_z : The value of raw Z data
 *	@param  data_r : The value of R data
 *
 *	@return results of compensated Z data value output as s16
 *
*/
s16 bmm050_compensate_Z(s16 mag_data_z, u16 data_r);
/*!
 *	@brief This API used to get the compensated Z data
 *	the out put of Z as s32
 *
 *
 *
 *  @param  mag_data_z : The value of raw Z data
 *	@param  data_r : The value of R data
 *
 *	@return results of compensated Z data value output as s32
 *
*/
s32 bmm050_compensate_Z_s32(s16 mag_data_z, u16 data_r);
#ifdef ENABLE_FLOAT
/*!
 *	@brief This API used to get the compensated Z data
 *	the out put of Z as float
 *
 *
 *
 *  @param  mag_data_z : The value of raw Z data
 *	@param  data_r : The value of R data
 *
 *	@return results of compensated Z data value output as float
 *
*/
float bmm050_compensate_Z_float (s16 mag_data_z, u16 data_r);
#endif
/********************************************/
/**\name CONTROL MEASUREMENT OF X AND Y  */
/********************************************/
/*!
 *	@brief This API used to set the control measurement
 *	X data in the register 0x4E bit 3
 *
 *
 *  @param  v_enable_disable_u8: The value of control measurement-x
 *   value  |  Status
 *  --------|----------
 *     1    | ENABLE
 *     0    | DISABLE
 *
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_set_control_measurement_x(
u8 v_enable_disable_u8);
/*!
 *	@brief This API used to set the control measurement
 *	Y data in the register 0x4E bit 4
 *
 *
 *  @param  v_enable_disable_u8: The value of control measurement-y
 *   value  |  Status
 *  --------|----------
 *     1    | ENABLE
 *     0    | DISABLE
 *
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_set_control_measurement_y(
u8 v_enable_disable_u8);
/********************************************/
/**\name SOFT RESET   */
/********************************************/
/*!
 *	@brief This API used reset the register values to default
 *	in the register 0x4B
 *
 *
 *
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_soft_rst(void);
/********************************************/
/**\name RAW XYZ DATA  */
/********************************************/
/*!
 *	@brief This API reads Magnetometer
 *	raw data of X,Y,Z values and RHALL values
 *	from location 0x42 to 0x49
 *
 *
 *
 *
 *  @param  mag_data : The data of raw XYZ data
 *
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_get_raw_xyz(
struct bmm050_mag_data_s16_t *mag_data);
/********************************************/
/**\name REMAPPED RAW XYZ DATA  */
/********************************************/
/*!
 *	@brief This API reads remapped Magnetometer
 *	raw data of X,Y,Z values and RHALL values
 *	from location 0x42 to 0x49
 *
 *	@note In this function X and Y axis is remapped
 *	@note X is read from the address 0x44 & 0x45
 *	@note Y is read from the address 0x42 & 0x43
 *	@note this API is only applicable for BMX055 sensor
 *
 *
 *
 *  @param  mag_data : The data of remapped raw XYZ data
 *
 *
 *	@return results of bus communication function
 *	@retval 0 -> Success
 *	@retval -1 -> Error
 *
*/
BMM050_RETURN_FUNCTION_TYPE bmm050_get_bmx055_remapped_raw_xyz(
struct bmm050_remapped_mag_s16_data_t *mag_data);

#endif
